From: kaf24@firebug.cl.cam.ac.uk Date: Fri, 5 May 2006 14:15:56 +0000 (+0100) Subject: Add more in_irq() checking. Add irq_enter()/irq_exit() where X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~16108^2~10^2 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/success//%22http:/www.example.com/cgi/success/?a=commitdiff_plain;h=e436b0962269bd1993364f94b3f4243050aacc91;p=xen.git Add more in_irq() checking. Add irq_enter()/irq_exit() where they are missing in a few places. Signed-off-by: Keir Fraser --- diff --git a/xen/arch/x86/domain.c b/xen/arch/x86/domain.c index 3e3a61f59b..bd4b6f08ab 100644 --- a/xen/arch/x86/domain.c +++ b/xen/arch/x86/domain.c @@ -753,7 +753,10 @@ int __sync_lazy_execstate(void) switch_required = (this_cpu(curr_vcpu) != current); if ( switch_required ) + { + ASSERT(current == idle_vcpu[smp_processor_id()]); __context_switch(); + } local_irq_restore(flags); diff --git a/xen/arch/x86/smp.c b/xen/arch/x86/smp.c index 53dec24c38..590e35921e 100644 --- a/xen/arch/x86/smp.c +++ b/xen/arch/x86/smp.c @@ -169,6 +169,7 @@ fastcall void smp_invalidate_interrupt(void) { ack_APIC_irq(); perfc_incrc(ipis); + irq_enter(); if ( !__sync_lazy_execstate() ) { if ( flush_va == FLUSHVA_ALL ) @@ -177,6 +178,7 @@ fastcall void smp_invalidate_interrupt(void) local_flush_tlb_one(flush_va); } cpu_clear(smp_processor_id(), flush_cpumask); + irq_exit(); } void __flush_tlb_mask(cpumask_t mask, unsigned long va) @@ -335,6 +337,8 @@ fastcall void smp_call_function_interrupt(struct cpu_user_regs *regs) if ( !cpu_isset(smp_processor_id(), call_data->selected) ) return; + irq_enter(); + if ( call_data->wait ) { (*func)(info); @@ -347,4 +351,6 @@ fastcall void smp_call_function_interrupt(struct cpu_user_regs *regs) atomic_inc(&call_data->started); (*func)(info); } + + irq_exit(); } diff --git a/xen/arch/x86/traps.c b/xen/arch/x86/traps.c index 76aa48d4cb..64ab6b69bc 100644 --- a/xen/arch/x86/traps.c +++ b/xen/arch/x86/traps.c @@ -674,6 +674,8 @@ asmlinkage int do_page_fault(struct cpu_user_regs *regs) unsigned long addr, fixup; int rc; + ASSERT(!in_irq()); + __asm__ __volatile__ ("mov %%cr2,%0" : "=r" (addr) : ); DEBUGGER_trap_entry(TRAP_page_fault, regs);